#ifndef _SERVIDOR_H
#define _SERVIDOR_H

#include <iostream>
#include <sstream>
#include <vector>

using namespace std;

class Servidor {
    public:
        static const int COORDENADOR = 0;
        static const int ESPERA_MAXIMA = 3;
        static const int TEMPO_PROCESSAMENTO_MAXIMO = 4;
        static const float PROBABILIDADE = 0.3;

        typedef enum MessageType {
            CAN_COMMIT,
            DO_COMMIT,
            DO_ABORT,
            HAVE_COMMITTED,
            GET_DECISION,
            YES,
            NO,
            MESSAGE_SIZE
        } MessageType;

        Servidor();
        ~Servidor();

        void init();

        int responder();
        bool ocorreuErro();
        void simularProcessamento();

        // coordenador
        bool canCommit();
        void doCommit();
        void doAbort();
        // participante
        void haveCommitted();
        int getDecision();

        inline int getId() const {
            return id;
        }

        inline char* getNome() {
            return nome;
        }

        inline bool isCoordenador() {
            return COORDENADOR == id;
        }

    private:
        int transacao;

        int id;
        int quantidadeNos;
        char nome[MPI_MAX_PROCESSOR_NAME];
        int tamanhoNome;
        int contadorRespostas;
        int decisao;
};

#endif /* _SERVIDOR_H */

